package com.excilys.formation.projet.ebanking.ws.rest;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.xml.ws.WebServiceException;

import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.excilys.formation.projet.ebanking.modele.Compte;
import com.excilys.formation.projet.ebanking.modele.Utilisateur;
import com.excilys.formation.projet.ebanking.service.api.IClientService;
import com.excilys.formation.projet.ebanking.service.api.ICompteService;
import com.excilys.formation.projet.ebanking.service.api.IUtilisateurService;
import com.excilys.formation.projet.ebanking.service.api.exception.SoldeInsuffisantException;
import com.excilys.formation.projet.ebanking.ws.rest.converters.CompteConverter;
import com.excilys.formation.projet.ebanking.ws.rest.dto.CompteDTO;

@Service("ebanking_rest")
@Produces("application/xml")
public class EBankingRest {

	@Autowired
	IClientService clientService;

	@Autowired
	IUtilisateurService utilisateurService;

	@Autowired
	ICompteService compteService;

	@GET
	@Path(value = "/comptes/{login}")
	public List<CompteDTO> getComptesByClient(@PathParam(value = "login") String loginClient) {
		Utilisateur utilisateur = utilisateurService.getUtilisateurByLogin(loginClient);

		if (utilisateur == null) {
			throw new WebServiceException("Le nom d'utilisateur n'existe pas");
		}

		List<Compte> list = clientService.getComptesByClient(utilisateur.getId());
		List<CompteDTO> listeComptesDTO = new ArrayList<CompteDTO>();

		CompteConverter compteConverter = new CompteConverter();
		for (Compte compte : list) {
			listeComptesDTO.add(compteConverter.modelToDto(compte));
		}
		return listeComptesDTO;
	}

	@POST
	@Path(value = "/virement")
	public void effectuerVirement(@FormParam(value = "compteSource") int idCompteSource, @FormParam(value = "compteDestination") int idCompteDestination,
			@FormParam(value = "montant") double montant) throws SoldeInsuffisantException {
		Compte compteSource = compteService.getCompte(idCompteSource);
		Compte compteDestination = compteService.getCompte(idCompteDestination);

		clientService.addVirementInterne(compteSource, compteDestination, montant, new DateTime());
	}

}